const db = require('../db/index.js');
// 导入加密中间件
const bcrypt = require('bcryptjs'); // 添加 bcrypt 依赖
// 导入jwt,用于生成token
const jwt = require('jsonwebtoken')
// 导入jwt配置文件,用于加密和解密
const jwtconfig = require('../jwt_config/index.js')

// 拿到前端所传递过来的数据
exports.register = (req, res) => {
	const regInfo = req.body;
	if (!regInfo.account || !regInfo.password) {
		return res.send({
			status: 1, // 注意：这里修改了 statusL 为 status，以保持一致性
			message: '账号或者密码不能为空'
		});
	}
	const sql = 'SELECT * FROM users WHERE account = ?';
	// (err, results)第一个是返回错误信息的参数,第二个是返回结果的参数
	// 第一个参数是执行语句,第二个是参数,第三个是一个函数,用于处理结果
	db.query(sql, [regInfo.account], (err, results) => { // 注意：将 regInfo.account 放在数组中传递，以确保与某些数据库库的兼容性
		if (results.length > 0) {
			return res.send({
				status: 1,
				message: '账号已存在'
			});
		}
		// 第三步,对密码进行加密
		// 需要使用加密中间件bcrypt.js,下载npm i bcrypt
		//用bcrypt中间件的hashSync()方法加密,第一个前端传过来的密码,第二个是加密的长度
		regInfo.password = bcrypt.hashSync(regInfo.password, 10);
		// 第四步,把账号和密码插入到users表中,使用mysql插入语法
		const sql1 = 'INSERT INTO users SET ?'; // 确保您的数据库库支持这种语法
		// 注册身份
		const identity = '用户';
		// 创建时间
		const create_time = new Date(); // 修正了 Data() 为 Date()
		db.query(sql1, {
			account: regInfo.account,
			password: regInfo.password,
			identity: identity,
			create_time: create_time,
			status: 0,
		}, (err, results) => {
			if (results.affectedRows !== 1) {
				return res.send({
					status: 1,
					message: '注册账号失败,错误'
				});
			}
			res.send({
				status: 0,
				message: '注册账号成功'
			});
		});
	});
};

exports.login = (req, res)=>{ // 跟注册一样都需要一个前端传过来的参数
const loginfo = req.body
// 第一步,查看数据库中有没有前端传过来的账号
const sql = 'select * from users where account = ?'
// res.send('登录');
db.query(sql, loginfo.account, (err, results) => {
	// 执行sql语句失败的情况,一般是在数据库断开的情况会执行失败
	if (err) return res.cc(err)
	// 查看数据表中有没有前端传过来的账号
	if (results.length !== 1) return res.cc('登陆失败')
	// 第二步,如果没有登陆失败就对前端出纳过来的密码解密
	// 使用加密中间件的一个compareSync方法
	// 第一个参数是前端传过来的密码,第二个是从后端查找到的密码
	const compareResult = bcrypt.compareSync(loginfo.password, results[0].password)
	// 如果比较失败就返回一个登陆失败的信息
	if (!compareResult) {
		return res.cc('登陆失败')
	}
	// 第三步:对帐号是否冻结做判断
	if (results[0].status == 1) {
		return res.cc('账号被冻结')
	}
	// 第四步生成返回给前端的token
	// 这个token我们需要剔除加密后的密码,头像,创建时间和更新时间
	const user = {
		...results[0],
		password: '',
		imageUrl: '',
		create_time: '',
		update_time: '',
	}
	// 设置token的有效时长,第一个参数是user,然后是配置,最后一个是时间
	// 有效时长是7个小时
	const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, {
		expiresIn: '7h'
	})
	// 返回token的前端,返回前端的用户数据
	res.send({
		results: results[0],//返回前端的用户数据
		status: 0,
		message: '登录成功',
		token: 'Bearer ' + tokenStr, // 必须要加上Bearer,因为这是token内部的一个规则
	})
})
};